import os
from moviepy import VideoFileClip, concatenate_videoclips

def merge_mp4_files(input_dir, output_file):
  """
  合并目录中的所有MP4文件为一个MP4文件

  参数:
      input_dir: 包含MP4文件的输入目录
      output_file: 合并后的输出文件路径
  """
  # 获取目录中所有的MP4文件
  mp4_files = [f for f in os.listdir(input_dir) if f.lower().endswith('.mp4')]
  mp4_files.sort()  # 按文件名排序

  if not mp4_files:
    print(f"在目录 {input_dir} 中没有找到MP4文件")
    return

  print(f"找到 {len(mp4_files)} 个MP4文件:")

  # 加载所有视频片段
  clips = []
  for file in mp4_files:
    file_path = os.path.join(input_dir, file)
    clip = VideoFileClip(file_path)
    clips.append(clip)

  # 合并视频
  final_clip = concatenate_videoclips(clips)

  # 写入输出文件
  print(f"正在合并视频到 {output_file}...")
  final_clip.write_videofile(output_file, codec = 'libx264', audio_codec = 'aac')

  # 关闭所有剪辑
  for clip in clips:
    clip.close()
  final_clip.close()

  print("视频合并完成!")

if __name__ == "__main__":
  # 用户输入目录
  input_directory = input("请输入包含MP4文件的目录路径: ").strip()

  # 检查目录是否存在
  if not os.path.isdir(input_directory):
    print(f"错误: 目录 {input_directory} 不存在")
    exit(1)

  # 设置输出文件路径
  output_directory = input("请输入输出目录路径(留空则使用输入目录): ").strip()
  if not output_directory:
    output_directory = input_directory

  output_filename = "merged_video.mp4"
  output_path = os.path.join(output_directory, output_filename)

  # 检查输出文件是否已存在
  if os.path.exists(output_path):
    overwrite = input(f"文件 {output_path} 已存在，是否覆盖? (y/n): ").lower()
    if overwrite != 'y':
      print("操作已取消")
      exit(0)

  # 合并视频
  merge_mp4_files(input_directory, output_path)
